package com.smartEdu.interceptors;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;

import com.smartEdu.commons.ClassStatic;
import com.smartEdu.commons.LogCvt;
import com.smartEdu.commons.Session;
import com.smartEdu.commons.Tag_Tips;
import com.smartEdu.handler.redis.RedisImpl;
import com.smartEdu.utils.JsonUtil;

import redis.clients.jedis.Jedis;

public class InterceptorApp extends HandlerInterceptorAdapter{  
    public static final String TAG = "InterceptorApp";  
    /* 
     * 利用正则映射到需要拦截的路径     
      
    private String mappingURL; 
     
    public void setMappingURL(String mappingURL) {     
               this.mappingURL = mappingURL;     
    }    
     */  
    /**  
     * 在业务处理器处理请求之前被调用  
     * 如果返回false  
     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
     * 如果返回true  
     *    执行下一个拦截器,直到所有的拦截器都执行完毕  
     *    再执行被拦截的Controller  
     *    然后进入拦截器链,  
     *    从最后一个拦截器往回执行所有的postHandle()  
     *    接着再从最后一个拦截器往回执行所有的afterCompletion()  
     */    
    @Override    
    public boolean preHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler) throws Exception { 
    	if (handler instanceof ResourceHttpRequestHandler)
    	    return true;
    	Session sess=new Session();
    	String token=request.getHeader("TOKEN");
    	if (token==null) {
    		sess.put(Tag_Tips.RESPCODE, Tag_Tips.ERROR);
    		setResponse(response, sess);
			return false;
		}
    	if (ClassStatic.redis==null) {
    		WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
    		ClassStatic.redis=(RedisImpl)wac.getBean("redis");
		}
    	Jedis jedis=null;
    	try{
    		jedis=ClassStatic.redis.getResource();
    		String tokenInRedis=jedis.hget(Tag_Tips.TOKENMAP, token);
    		if (tokenInRedis==null) {
    			sess.put(Tag_Tips.RESPCODE, Tag_Tips.ERROR);
    			setResponse(response, sess);
    			return false;
    		}
    		LogCvt.debug(token);
//    		jedis.hset("TOKENMAP", request.getSession().getId(), DateUtil.date2String(new Date()));
    	}
    	catch(Exception e){
    		LogCvt.error(TAG,e);
    	}
    	finally {
    		if (jedis!=null) {
    			ClassStatic.redis.returnResource(jedis);
			}
    		request.setAttribute("sess", sess);
		}
    	sess.put(Tag_Tips.RESPCODE, Tag_Tips.OK);  
        String requestUri = request.getRequestURI();  
//        String contextPath = request.getContextPath();  
//        String url = requestUri.substring(contextPath.length());
        LogCvt.info("请求url:"+requestUri);       
//        LogCvt.info("内部url:"+url);
        LogCvt.info("请求数据:"+request.getParameter(Tag_Tips.REQUEST));
        return true;     
    }    
    
    /** 
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
     * 可在modelAndView中加入数据，比如当前时间 
     */  
    @Override    
    public void postHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler,    
            ModelAndView modelAndView) throws Exception {       
        if(modelAndView != null){  //加入当前时间    
            modelAndView.addObject("var", "测试postHandle");    
        }    
    }    
    
    /**  
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
     */    
    @Override    
    public void afterCompletion(HttpServletRequest request,    
            HttpServletResponse response, Object handler, Exception ex)    
            throws Exception {
    	Session sess=(Session) request.getAttribute("sess");
    	sess.clear();
    	sess=null; 
    } 
    
    public void setResponse(HttpServletResponse response,Session sess){
    	try {
			response.getWriter().write(JsonUtil.toJson(sess.getVals()));
			LogCvt.info("响应数据:"+JsonUtil.toJson(sess.getVals()));
		} catch (IOException e) {
			LogCvt.error(e.getMessage(),e);
		}
    }
    
  
} 
